//导入express
const express = require('express')
//创建服务器的实例对象
const app = express()
const Joi = require('joi')

//导入cors中间件
const cors = require('cors')
//配置cors中间件
app.use(cors())

//配置解析json格式数据的中间件
app.use(express.json())
//配置解析表单数据中间件：只能解析application/x-www-form-urlencoded格式的表单数据
app.use(express.urlencoded({ extended: false }))

//声明一个响应数据的中间件，一定放在路由之前，否则路由访问不到(只返回状态码status和信息message）
app.use((req, res, next) => {
    //status=0为成功，status=1为失败，默认值为1
    res.cc = function (err, status = 1) {
        res.send( {
            status,
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})
//响应数据的中间件，返回status,message,data
app.use((req, res, next) => {
    //status=0为成功，status=1为失败，默认值为1
    res.dataSend = function (err, status = 1,data) {
        res.send( {
            status,
            message: err instanceof Error ? err.message : err,
            data
        })
    }
    next()
})
//用于响应分页数据的中间件，返回status,message,data
app.use((req, res, next) => {
    //status=0为成功，status=1为失败，默认值为1，total为总条数，size为一页多少条数据，current为当前在多少页
    res.pageSend = function (err, status = 1,data,total=0,size=10,current=1) {
        res.send( {
            status,
            message: err instanceof Error ? err.message : err,
            data,
            total,
            size,
            current
        })
    }
    next()
})

//设置一个全局的token黑名单，存入失效的token（退出登录后token失效）
global.tokenList = []
//解析token的中间件，一定放在路由之前，否则路由访问不到
const config = require('./config')
const { expressjwt: expressJWT } = require('express-jwt')
app.use(expressJWT({
    secret: config.jwtSecretKey,
    algorithms: ["HS256"],
    //验证token是否失效
    isRevoked: async (req, token) => {
        const myToken = req.headers['authorization'].split(' ')[1]
        if(tokenList.includes(myToken)){
            return true
        } else {
            return false
        }
    }
    //设置白名单，不需要进行token验证的接口，check下只有登录和注册，这两个接口都不要token验证，大屏也不进行验证
    }).unless({ path: [/^(\/check|\/bigScreen|\/test)/]}))

//生成测试数据
const createTestDataRouter = require('./router/createTestData')
app.use('/test',createTestDataRouter)
//导入并使用登录注册路由模块
const checkRouter = require('./router/check')
app.use('/check',checkRouter)
//用户路由模块
const userRouter = require('./router/user')
app.use('/user',userRouter)
//权限管理-用户管理路由模块
const permissionUserRouter = require('./router/permissionUser')
app.use('/permission/user',permissionUserRouter)
//权限管理-角色管理路由模块
const roleRouter = require('./router/role')
app.use('/permission/role',roleRouter)
//权限管理-菜单管理路由模块
const menuRouter = require('./router/menu')
app.use('/permission/menu',menuRouter)
//主题监管-人物监管
const personRouter = require('./router/person')
app.use('/supervise/person',personRouter)
//人员管理-基础信息
const basicInfoRouter = require('./router/basicInfo')
app.use('/staff/basicInfo',basicInfoRouter)
//大屏
const bigScreenRouter = require('./router/bigScreen')
app.use('/bigScreen',bigScreenRouter)

//错误级别的中间件
app.use((err,req,res,next) => {
    //验证失败导致的错误
    if(err.error instanceof Joi.ValidationError) return res.cc(err.error.details[0].message)
    //身份认证失败
    if(err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
    //未知的错误
    res.cc(err)
})

//启动服务器
app.listen(3007,()=>{
    console.log('api server running at http://127.0.0.1:3007')
})
